/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package treegen;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.util.Callback;

/**
 * Класс панели вкладки "Листья", считывающая параметры листьев
 *
 * @author Дарья
 */
public class LeafPanel {

    /**
     * Панель вкладки "Листья"
     */
    public VBox mainPane;
    /**
     * КомбоБокс для выбора типа листьев
     */
    public static ComboBox COMBO_SHAPE = new ComboBox();
    /**
     * Панель для типа листьев
     */
    private HBox shape = new HBox();
    /**
     * КомбоБокс для выбора размера листьев
     */
    public static ComboBox COMBO_SIZE = new ComboBox();
    /**
     * Панель для размера листьев
     */
    private HBox size = new HBox();
    /**
     * КомбоБокс для выбора цвета листьев
     */
    public static ComboBox COMBO_COLOR = new ComboBox();
    /**
     * Панель для цвета листьев
     */
    private HBox color = new HBox();
    /**
     * Текст для панелей
     */
    private Text text;
    /**
     * Кнопка "Снегерировать"
     */
    private Button generate;
    /**
     * Панель для сброса настроек
     */
    private HBox reset = new HBox();
    /**
     * Кнопка "Сбросить"
     */
    private Button buttonReset = getButton("Сбросить");

    /**
     * Конструктор, иницилизирующий панель для вкладки "Листья"
     *
     * @see LeafPanel
     * @param tree дерево
     */
    public LeafPanel(Tree tree) {
        final TreeGen t = tree.window;
        mainPane = new VBox();
        Callback<ListView<String>, ListCell<String>> factory = new Callback<ListView<String>, ListCell<String>>() {
            @Override
            public ListCell<String> call(ListView<String> list) {
                return new LeafPanel.ImageCell();
            }
        };

        //Комбобокс для формы листьев
        COMBO_SHAPE.getItems().addAll("Oтсутствует", "Игольчатая", "Линейная", "Ланцетная",
                "Овальная", "Округлая", "Сердцевидная", "Дельтовидная",
                "Обратнояйцевидная", "Ромбовидная", "Заострённая",
                "Веерообразная", "Дланевидная", "Почковидная");
        COMBO_SHAPE.getSelectionModel().selectedItemProperty().addListener(
                new ChangeListener() {
                    @Override
                    public void changed(ObservableValue ov, Object t, Object t1) {
                        buildShape();
                    }
                });
        COMBO_SHAPE.setCellFactory(factory);
        COMBO_SHAPE.setButtonCell(factory.call(null));
        COMBO_SHAPE.setValue("Oтсутствует");

        //Виджет для формы листьев
        text = new Text("Форма листьев: ");
        text.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        shape.getChildren().addAll(text, COMBO_SHAPE);
        shape.setPadding(new Insets(0, 0, 10, 0));

        //Комбобокс для размеров листьев
        COMBO_SIZE.getItems().addAll("Oтсутствует", "Крупные(20-40 см)", "Средние (до 20 см)", "Малые (до 10 см)");
        COMBO_SIZE.getSelectionModel().selectedItemProperty().addListener(
                new ChangeListener() {
                    @Override
                    public void changed(ObservableValue ov, Object t, Object t1) {
                        buildSize();
                    }
                });
        COMBO_SIZE.setCellFactory(factory);
        COMBO_SIZE.setButtonCell(factory.call(null));
        COMBO_SIZE.setValue("Oтсутствует");

        //Виджет для размеров листьев
        text = new Text("Размер листьев: ");
        text.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        size.setPadding(new Insets(0, 0, 10, 0));
        size.getChildren().addAll(text, COMBO_SIZE);

        //Комбобокс для цвета листьев
        COMBO_COLOR.getItems().addAll("Oтсутствует", "Оранжевый", "Жёлтый", "Пурпурный", "Зелёный", "Темно-зелёный");
        COMBO_COLOR.getSelectionModel().selectedItemProperty().addListener(
                new ChangeListener() {
                    @Override
                    public void changed(ObservableValue ov, Object t, Object t1) {
                        buildColor();
                    }
                });
        COMBO_COLOR.setCellFactory(factory);
        COMBO_COLOR.setButtonCell(factory.call(null));
        COMBO_COLOR.setValue("Oтсутствует");

        //Виджет для цвета листьев
        text = new Text("Цвет листьев: ");
        text.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        color.getChildren().addAll(text, COMBO_COLOR);
        color.setPadding(new Insets(0, 0, 10, 0));

        //Кнопка "Сбросить"
        text = new Text("Сбросить");
        text.setFont(Font.font("Verdana", FontWeight.BOLD, 14));
        buttonReset.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                clean();
            }
        });

        reset.getChildren().add(buttonReset);
        reset.setPadding(new Insets(20, 20, 0, 10));
        HBox button1 = new HBox();
        generate = getButton("Сгенерировать");
        generate.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                t.cleanCanvas();
                t.getValues();
            }
        });

        button1.getChildren().add(generate);
        button1.setPadding(new Insets(0, 20, 0, 10));
        reset.getChildren().add(button1);
        mainPane.getChildren().addAll(shape, size, color, reset);
        mainPane.setPadding(new Insets(5, 0, 5, 10));

    }

    /**
     * Получить кнопку в нужном стиле
     *
     * @param text текст кнопки
     * @return кнопка
     */
    private Button getButton(String text) {
        Button button = new Button(text);
        button.setStyle("-fx-background-color:grey;");
        button.setTextFill(Color.WHITE);
        button.setFont(Font.font("Verdana", FontWeight.BOLD, 12));
        return button;
    }

    /**
     * Очистить панель вкладки "Листья"
     */
    public void clean() {
        COMBO_SHAPE.setValue("Oтсутствует");
        COMBO_SIZE.setValue("Oтсутствует");
        COMBO_COLOR.setValue("Oтсутствует");
    }

    /**
     * Получить параметры листьев
     */
    public static void getValues() {
        Leaf.SHAPE = (String) COMBO_SHAPE.getValue();
        Leaf.COLOR = (String) COMBO_COLOR.getValue();
        Leaf.SIZE = (String) COMBO_SIZE.getValue();
        Leaf.setFactor();
        Leaf.loadImage();
    }

    /**
     * Получить параметры листьев при изменении их типа
     */
    public void buildShape() {
        String l = (String) COMBO_SHAPE.getValue();
        if (l.contains("Oтсутствует")) {
            COMBO_SIZE.setValue("Oтсутствует");
            COMBO_COLOR.setValue("Oтсутствует");
        } else {
            String size = (String) COMBO_SIZE.getValue();
            if (size.contains("Oтсутствует")) {
                COMBO_SIZE.setValue("Средние (до 20 см)");
            }
            String color = (String) COMBO_COLOR.getValue();
            if (color.contains("Oтсутствует")) {
                COMBO_COLOR.setValue("Зелёный");
            }
        }
    }

    /**
     * Получить параметры листьев при изменении их размеров
     */
    public void buildSize() {
        String l = (String) COMBO_SHAPE.getValue();
        String s = (String) COMBO_SIZE.getValue();
        if (s.contains("Oтсутствует") && !l.contains("Oтсутствует")) {
            COMBO_SHAPE.setValue("Oтсутствует");
            COMBO_COLOR.setValue("Oтсутствует");
        }
    }

    /**
     * Получить параметры листьев при изменении их цвета
     */
    public void buildColor() {
        String l = (String) COMBO_SHAPE.getValue();
        String c = (String) COMBO_COLOR.getValue();
        if (c.contains("Oтсутствует") && !l.contains("Oтсутствует")) {
            COMBO_SHAPE.setValue("Oтсутствует");
            COMBO_SIZE.setValue("Oтсутствует");
        }
    }

    private static class ImageCell extends ListCell<String> {

        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (item != null) {
                if (item.contains("Oтсутствует")) {
                    HBox emptytype = new HBox();
                    Text text = new Text("Oтсутствует");
                    text.setFont(Font.font("Verdana", 12));
                    emptytype.getChildren().addAll(text);
                    setGraphic(emptytype);
                } else if (item.contains("Игольчатая")) {
                    HBox acicular = new HBox();
                    Text text = new Text("Игольчатая");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image;
                    image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/igolka_green.png")));
                    acicular.getChildren().addAll(image, text);
                    setGraphic(acicular);
                } else if (item.contains("Линейная")) {
                    HBox linear = new HBox();
                    Text text = new Text("Линейная");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/line_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Ланцетная")) {
                    HBox linear = new HBox();
                    Text text = new Text("Ланцетная");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/lanceolate_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Овальная")) {
                    HBox linear = new HBox();
                    Text text = new Text("Овальная");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/oval_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Округлая")) {
                    HBox linear = new HBox();
                    Text text = new Text("Округлая");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/roundish_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Сердцевидная")) {
                    HBox linear = new HBox();
                    Text text = new Text("Сердцевидная");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/cordate_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Дельтовидная")) {
                    HBox linear = new HBox();
                    Text text = new Text("Дельтовидная");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/deltoid_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Обратнояйцевидная")) {
                    HBox linear = new HBox();
                    Text text = new Text("Обратнояйцевидная");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/obovate_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Ромбовидная")) {
                    HBox linear = new HBox();
                    Text text = new Text("Ромбовидная");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/rhomboid_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Заострённая")) {
                    HBox linear = new HBox();
                    Text text = new Text("Заострённая");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/pointed_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Веерообразная")) {
                    HBox linear = new HBox();
                    Text text = new Text("Веерообразная");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/harp_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Дланевидная")) {
                    HBox linear = new HBox();
                    Text text = new Text("Дланевидная");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/palmate_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Почковидная")) {
                    HBox linear = new HBox();
                    Text text = new Text("Почковидная");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/nodular_green.png")));
                    linear.getChildren().addAll(image, text);
                    setGraphic(linear);
                } else if (item.contains("Крупные(20-40 см)")) {
                    HBox large = new HBox();
                    Text text = new Text("Крупные(20-40 см)");
                    text.setFont(Font.font("Verdana", 12));
                    large.getChildren().addAll(text);
                    setGraphic(large);
                } else if (item.contains("Средние (до 20 см)")) {
                    HBox middle = new HBox();
                    Text text = new Text("Средние (до 20 см)");
                    text.setFont(Font.font("Verdana", 12));
                    middle.getChildren().addAll(text);
                    setGraphic(middle);
                } else if (item.contains("Малые (до 10 см)")) {
                    HBox small = new HBox();
                    Text text = new Text("Малые (до 10 см)");
                    text.setFont(Font.font("Verdana", 12));
                    small.getChildren().addAll(text);
                    setGraphic(small);
                } else if (item.contains("Оранжевый")) {
                    HBox orange = new HBox();
                    Text text = new Text("Оранжевый");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/orange.png")));
                    orange.getChildren().addAll(image, text);
                    setGraphic(orange);
                } else if (item.contains("Жёлтый")) {
                    HBox yellow = new HBox();
                    Text text = new Text("Жёлтый");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/yellow.png")));
                    yellow.getChildren().addAll(image, text);
                    setGraphic(yellow);
                } else if (item.contains("Пурпурный")) {
                    HBox red = new HBox();
                    Text text = new Text("Пурпурный");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/red.png")));
                    red.getChildren().addAll(image, text);
                    setGraphic(red);
                } else if (item.contains("Зелёный")) {
                    HBox green = new HBox();
                    Text text = new Text("Зелёный");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/green.png")));
                    green.getChildren().addAll(image, text);
                    setGraphic(green);
                } else if (item.contains("Темно-зелёный")) {
                    HBox darkGreen = new HBox();
                    Text text = new Text("Темно-зелёный");
                    text.setFont(Font.font("Verdana", 12));
                    ImageView image = new ImageView(new Image(LeafPanel.class.getResourceAsStream("pictures/dark green.png")));
                    darkGreen.getChildren().addAll(image, text);
                    setGraphic(darkGreen);
                }
            }
        }
    }
}
